/**
 * 解析模块
 * @param modulesList  模块对象列表
 * @param type 模块类型，component 组件，function 方法，directive 指令
 */
const exportModule = (modulesList, type) => {
  // 获取模块对象列表
  let modules = modulesList.keys().reduce((obj, modulePath) => {
    // 模块名
    let moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1');
    // 模块对象
    let moduleObj = modulesList(modulePath);
    // 放入模块
    obj[moduleName] = moduleObj.default;
    // 组件的单个导出
    if (type === 'component') {
      Object.assign(exports, { [moduleName]: moduleObj.default });
    }
    return obj;
  }, {});
  // 要导出的
  let exportModules;
  switch (type) {
    case 'component': {
      // 全局引入
      exportModules = (Vue, opts = {}) => {
        for (let i in modules) {
          Vue.component(i, modules[i]);
        }
      };
      //支持使用标签方式引入
      if (typeof window !== 'undefined' && window.Vue) {
        exportModules(window.Vue);
      }
      break;
    }
    case 'function': {
      exportModules = modules;
      break;
    }
    case 'directive': {
      // 全局引入
      exportModules = (Vue, opts = {}) => {
        for (let i in modules) {
          Vue.directive(i, modules[i]);
        }
      };
      break;
    }
  }
  return exportModules;
};
// --- 组件 ---
const componentList = require.context('./components', true, /\.vue$/);
const KntComponents = exportModule(componentList, 'component');

// --- 方法 ---
const functionList = require.context('./functions', true, /\.js$/);
const KntBase = exportModule(functionList, 'function');

// --- 指令 ---
const directiveList = require.context('./directive', true, /\.js$/);
const KntDirectives = exportModule(directiveList, 'directive');

// 合并导出
Object.assign(exports, { KntComponents }, { KntBase }, { KntDirectives });
